<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ～ ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catchAdmin\stock\excl;

use catchAdmin\stock\model\Stock as StockModel;
use catcher\library\excel\ExcelContract;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

class stockExport implements ExcelContract
{
    protected $orderModel;


    /**
     *
     * @time 2021/11/03 14:02
     * @param StockModel $stockModel
     * @return mixed
     */
    public function __construct(StockModel $stockModel)
    {
        // 设置内存限制
        ini_set('memory_limit', '1024M');
        // 设置执行时间
        set_time_limit(600);  // 10分钟
        
        $this->stockModel = $stockModel;
    }
    /**
     * 设置头部
     *
     * @time 2020年09月08日
     * @return string[]
     */
    public function headers(): array
    {
        // TODO: Implement headers() method.
        return [
            '委托方名称',
            '货主',
            '托盘码',
            '批次号',
            '料号名称',
            '料号',
            '规格数量',
            '规格单位',
            '数量',
            '箱数',
            '库位',
            '入库时间',
            '客户业务单号',
            'lot01',
            'lot02',
            '良品数',
            '冻结数',
            '不良品数',
            '托盘数',
            '出库数量',
            '出库状态',
            '收货日期',
            'LOT1',
            'LOT2',
            'LOT3',
            '料号体系',
            '供应商',
            '制造商'
        ];
    }
//    public function getPushInventoryAttr($value)
//    {
//        $status = [0=>'未推送',1=>'电子口岸已暂存',2=>'电子口岸申报中',3=>'发送海关成功',4=>'发送海关失败',100=>'海关退单',120=>'海关入库', 300=>'人工审核',399=>'海关审结',800=>'放行',899=>'结关',500=>'查验',501=>'扣留移送通关',502=>'扣留移送缉私',503=>'扣留移送法规',599=>'其它扣留',700=>'退运'];
//
//        return array_key_exists($value,$status)?$status[$value]:$value;
//    }

    /**
     * 处理数据
     *
     * @time 2020年09月08日
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @return \think\Collection
     */
    public function sheets()
    {
        // 设置每批处理的数量
        $batchSize = 1000;
        $page = 1;
        $allData = [];
        
        while(true) {
            // 分批获取数据
            $list = $this->stockModel->getExportList($page, $batchSize);
            
            if (empty($list)) {
                break;
            }
            
            foreach ($list as $key => &$value){
                if($value['status'] == 0){
                    $value['status'] = '未出库';
                }else if($value['status'] == 1){
                    $value['status'] = '全部出库';
                }else if($value['status'] == 2){
                    $value['status'] = '部分出库';
                }
                if (isset($value['goods_Cname']) && $value['goods_Cname'] !== '' && $value['goods_Cname'][0] === '=') {
                    $value['goods_Cname'] = ' '.$value['goods_Cname'];
                }
            }
            
            $allData = array_merge($allData, $list);
            $page++;
            
            // 释放内存
            unset($list);
            gc_collect_cycles();
        }
        
        return $allData;
    }

    /**
     * 设置开始行
     *
     * @time 2020年09月08日
     * @return int
     */
    public function setRow()
    {
        return 2;
    }
    /**
     * 设置行宽
     *
     * @time 2020年09月08日
     * @return int
     */
    public function setWidth()
    {
        return [
            "A"=>30,
            "B"=>20,
            "C"=>20,
            "D"=>30,
            "E"=>30,
            "F"=>20,
            "G"=>20,
            "H"=>20,
            "I"=>20,
            "J"=>30,
            "K"=>30,
            "L"=>20,
            "M"=>20,
            "N"=>20,
            "O"=>20,
            "P"=>20,
            "Q"=>20,
            "R"=>20,
            "S"=>20,
            "T"=>30,
            "U"=>30,
            "V"=>30,
            "W"=>30,
            "X"=>30,
            "Y"=>30,
            "Z"=>20,
            "AA"=>20,
            "AB"=>20
        ];
    }

    /**
     * 设置标题
     *
     * @time 2020年09月08日
     * @return array
     */
    public function setTitle()
    {
        return [
            'A1:J1', '导出库存', Alignment::HORIZONTAL_CENTER
        ];
    }
}